package org.yzh.www.chart;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.yzh.www.utils.GeneratePieChartUtil;
import org.yzh.www.utils.JFreeChartUtil;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.util.*;
import java.util.List;

public class PieCharts {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // 创建窗口并添加面板
            JFrame frame = new JFrame("饼图展示");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            try {
                // 初始化颜色和偏移百分比列表（示例中颜色和偏移百分比固定）
                List<Color> fixedLegendColorList = Arrays.asList(
                        Color.YELLOW, Color.GRAY, Color.GREEN, Color.CYAN, Color.ORANGE
                );
                double explodePercent = 0.1; // 示例中所有类别的偏离百分比相同

                // 创建工作簿对象
                Workbook workbook = new XSSFWorkbook(new FileInputStream("src/main/resources/excel/缓考学生信息.xlsx"));
                Sheet sheet = workbook.getSheetAt(0); // 假设数据在第一个Sheet中

                // 统计不同报名原因及其数量
                Map<String, Integer> reasonCountMap = new HashMap<>();
                for (Row row : sheet) {
                    if (row.getRowNum() == 0) continue; // 跳过表头行
                    String reason = row.getCell(7).getStringCellValue(); // 假设第四列是报名原因
                    reasonCountMap.put(reason, reasonCountMap.getOrDefault(reason, 0) + 1);
                }
                /*int maxLength = 4; // 设定标签的最大长度
                List<String> legendNameList = new ArrayList<>();
                for (String reason : reasonCountMap.keySet()) {
                    legendNameList.add(shortenReason(reason, maxLength));
                }*/
                List<String> legendNameList = new ArrayList<>(reasonCountMap.keySet()); // 报名原因列表
                // 根据统计结果初始化列表
                List<Object> dataList = new ArrayList<>(reasonCountMap.values()); // 每种原因对应的数量列表

                // 初始化颜色列表，确保长度与原因数量匹配，循环使用固定颜色列表
                List<Color> legendColorList = new ArrayList<>();
                for (int i = 0; i < legendNameList.size(); i++) {
                    legendColorList.add(fixedLegendColorList.get(i % fixedLegendColorList.size()));
                }

                // 初始化爆炸百分比列表，所有项使用相同偏离百分比
                List<Double> explodePercentList = Collections.nCopies(dataList.size(), explodePercent);

                print(legendNameList, dataList, legendColorList, explodePercentList);

                // 假设GeneratePieChartUtil和JFreeChartUtil是存在的类，下面的调用需要根据实际的类和方法进行调整
                // 注意：此处假设createPieChart方法被调整为返回JPanel或JFreeChart以便于直接添加到Swing组件中
                byte[] byteArray = GeneratePieChartUtil.createPieChart("各级占比情况", legendNameList, dataList,
                        900, 900, JFreeChartUtil.createChartTheme("宋体"), legendColorList, explodePercentList);

                // 将字节流转换为BufferedImage
                ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
                BufferedImage image = ImageIO.read(bis);

                // 创建JLabel来显示图像
                JLabel label = new JLabel(new ImageIcon(image));

                // 创建JPanel并添加标签
                JPanel panel = new JPanel();
                panel.setLayout(new BorderLayout());
                panel.add(label, BorderLayout.CENTER);

                frame.getContentPane().add(panel);
                frame.pack();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
                JLabel errorLabel = new JLabel("图表生成出错：" + e.getMessage());
                frame.getContentPane().add(errorLabel, BorderLayout.CENTER);
            }

            frame.setVisible(true);
        });
    }

    private static void print(List<String> legendNameList, List<Object> dataList, List<Color> legendColorList, List<Double> explodePercentList) {
        System.out.println("图例名称列表: " + legendNameList);
        System.out.println("数据列表: " + dataList);
        System.out.println("图例颜色列表: " + legendColorList);
        System.out.println("偏离百分比列表: " + explodePercentList);
    }
    /**
     * 短化原因字符串。
     * 如果原因字符串的长度超过了指定的最大长度，它将被缩短为最大长度减去3个字符，并以"..."结尾。
     * 这样做的目的是为了在不丢失关键信息的前提下，确保字符串长度符合要求。
     * 如果原因字符串的长度未超过最大长度，则原样返回。
     *
     * @param reason 原始原因字符串。
     * @param maxLength 允许的最大长度。
     * @return 短化后的原因字符串。
     */
    private static String shortenReason(String reason, int maxLength) {
        if (reason.length() > maxLength) {
//            return reason.substring(0, maxLength - 3) + "...";
            return "其他原因";
        }
        return reason;
    }
}